使用Object类型的多态引用是会付出代价的
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
当你开始以Object
类型使用所有超适用性参数和返回类型之前,你应该要考虑到使用Object
类型引用的一些问题。注意到此处的讨论不涉及创建出Object
类型的实例,此处Object
类型仅作为引用变量使用。
如果你打算创建出一个可以保存任何一种对象的ArrayList
时,你会如此的声明:
ArrayList<Object> myDogArrayList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogArrayList.add(aDog);
任何从ArrayList<Object>
取出的东西都会被当作Object
类型的引用而不管它原来是什么。无论放进去的对象是什么,出来后都变成Object
。
如果让Object调用Dog才有的方法是什么效果呢?
Object o = myDogArrayList.get(0); //将Object赋值给新的Object引用变量
int i = o.hashCode();
o.bark();//不能这么做,因为Object根本就不知道什么是bark()
编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object实际指向的对象类型。就算你知道对象有这个功能,编译器还是会把它当作一般的Object来看待,编译器只管引用的类型而不是对象的类型。
在线练习
{$ activeFileHint $}